iT邦幫忙

DAY 6
1

用程式描繪世界 - 閱讀The Nature of Code系列 第 6

[Day6] - 常態分佈(Normal Distribution)

  • 分享至 

  • xImage
  •  

這節要去學習的是有關於normal distribution的知識,他被稱為常態分佈(Normal distribution),或者是高斯分佈(Gaussian distribution),講到這裡或許許多人就已經知道這是什麼了,不過我在今天之前是一知半解的,立馬學習!

舉例來說在一群人中,有高有矮有胖有瘦,不會每個人身形樣貌都差不多,與我們用random()產生出來的結果是不一樣的,以身高來看,如果是Uniform distribution的表現方式,190公分以上與170到180公分以及170公分以下,不管哪個區間都應該有相同的數目,但回想我國中的時候身高15x公分..算是矮小的,比較要好的朋友只有一兩個,因為他們身高跟我差不多,自然而然就成為好朋友哈哈,班上的同學少數長得特別高或特別矮,
但大部份的人都或在一個差不多的平均高度,這就是常態分佈啦~

再解釋常態分佈之前還要解釋兩個名詞,平均值(mean)與標準差(standard deviation),平均值簡單易懂,
就是大家的平均啦,而標準差稍微難一點,見下圖:

左邊的圖有較低的較低的標準差,右邊的圖則標準差較高,可以看出標準差代表的是數據的集中程度,較集中的數據有較低的標準差。

有時候在考試成績公佈的時候聽到(或在考試中看到?),離平均少了幾個標準差,查了一下,幾個標準差的意義代表距離平均有多遠,公式上是...,好吧~我看不懂,直接拿常態分佈來做結論,見下圖

這是常態分佈,68%會落在1個標準差內,95%會落在2個標準差之內,99.7%會落在三個標準差之內,回到開頭所提的就是越極端的數值,數目越少啦!

可惡,看了這麼多數學我都快暈倒了,還好這節的程式不需要自己刻,Processing內建了常態分佈的方法,

常態分佈的方法在Random class下,所以我們可以先在setup()中宣告一個Random object出來

Random generator;

void setup() {
  size(640,360);
  generator = new Random();
}

然後重點就是nextGaussian()這個方法,會將平均值設為0,標準差設定在1回傳一個常態分佈的隨機數字,回傳的型別為
Double我們將它轉為Float

void draw() {
  float num = (float) generator.nextGaussian();
}

我們的目的是在螢幕上用圓形打點,在X軸上畫出常態分佈的狀況,目前螢幕寬度為640,我們預期要將x軸的平均值設在320px,標準差設定為60px(看倌可以隨意調整),那要如何從nextGaussian()產生的直轉變為我們要的結果,就是將 nextGaussian()產生的值 X 60(標準差) + 320(平均數),如下:

void draw() {
  float num = (float) generator.nextGaussian();
  float sd = 60;
  float mean = 320;

  float x = sd * num + mean;

  noStroke();
  fill(255,10);
  ellipse(x,180,16,16);
}

最後完成的圖形就會是一個漂亮的常態分佈啦!

下一篇會做幾個有趣的圖形練習,試著將distribution的概念融會貫通。


上一篇
[Day5] - Non-Uniform Distribution
下一篇
[Day7] - 來畫個圖吧,練習Distribution只是順便~
系列文
用程式描繪世界 - 閱讀The Nature of Code9
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言